home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / swagg_m.zip / MEMORY.SWG / 0045_Stack Swapping.pas < prev    next >
Pascal/Delphi Source File  |  1994-01-27  |  3KB  |  56 lines

  1. {
  2. > Also, can you tell me what the opro procedure SwapStackAndCallNear()
  3. > does?  Does it save registers, swap SP and do a near call, or what?
  4.  
  5. From the description DJ gave, I reconstructed it for you:
  6. }
  7.  
  8. procedure SwapStackAndCallNear(Routine: Word;
  9.                                SP: Pointer;
  10.                                var Regs);
  11. {
  12.   Flags are saved (unchanged during routine),
  13.   Stack is restored after completion,
  14.   Registers AX,BX,CX,DX,SI,DI and ES destroyed.
  15. }
  16. InLine(
  17.   $9C/     {      PUSHF                              }
  18.   $07/     {      pop   ES    ; ES := flags          }
  19.   $58/     {      pop   AX    ; AX := Regs ofs       }
  20.   $5B/     {      pop   BX    ; BX := Regs seg       }
  21.   $59/     {      pop   CX    ; CX := SP ofs         }
  22.   $5A/     {      pop   DX    ; DX := SP seg         }
  23.   $5F/     {      pop   DI    ; DI := near routine   }
  24.            { @SwapStack                              }
  25.   $8C/$D6/ {      mov   SI,SS ; SI := SS = stack seg }
  26.   $FA/     {      cli         ; disable interrupts   }
  27.   $8E/$D2/ {      mov   SS,DX ; SS := DX = SP seg    }
  28.   $87/$CC/ {      xchg  SP,CX ; CX := SP = stack ofs }
  29.            {                  ; SP := SP = SP ofs    }
  30.   $06/     {      PUSH  ES    ; push ES (= flags)    }
  31.   $9D/     {      POPF        ; set flags again      }
  32.   $9C/     {      PUSHF       ; push flags           }
  33.   $56/     {      PUSH  SI    ; SI = old stackseg SS }
  34.   $51/     {      PUSH  CX    ; CX = old stackofs SP }
  35.            { @CallNear:                              }
  36.   $53/     {      PUSH  BX    ; BX = ofs Regs var    }
  37.   $50/     {      PUSH  AX    ; AX = seg Regs var    }
  38.   $FF/$15/ {      CALL  WORD PTR [DI]  ; near call   }
  39.            { @SwapBackStack:                         }
  40.   $FA/     {      CLI         ; disable interrupts   }
  41.   $59/     {      pop   CX    ; CX := old stackofs SP}
  42.   $5E/     {      pop   SI    ; SI := old stackseg SS}
  43.   $07/     {      pop   ES    ; pop flags in ES      }
  44.   $8E/$D6/ {      mov   SS,SI ; stack seg back in SS }
  45.   $89/$CC/ {      mov   SP,CX ; stack ofs back in SP }
  46.            { @Exit:                                  }
  47.   $06/     {      PUSH  ES    ; push values of flags }
  48.   $9D);    {      POPF        ; pop unchanged flags  }
  49.  
  50. {
  51. > I would like to write my own code to do this because I don't have
  52. > opro, and I'm not going to buy it for one procedure... :)
  53. Please test my InLine macro, and tell me if this works. Sometime soon I'll
  54. try to experiment with PAUSEDEV myself (if I can find it again, that is ;-)
  55. }
  56.